package ads.pin.pinmon.dal;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import ads.pin.pinmon.entity.Player;

/**
 * Classe de acesso a dados para o Jogador.
 * 
 * Save Query: insert into player ( name, points_round, points_total,
 * creature_a_id, creature_b_id) values (?, ?, ?, ?, ?)
 * 
 * Deve ser utilizada apenas para a comunicacao com o database, contendo metodos
 * relacionados ao mesmo: Save(insert), Update, Select, Delete.
 * 
 * @author
 * 
 */
public class PlayerDAO {

	private EntityManager em = new EntityManager() {

		@Override
		public Object treatResultSet(ResultSet resultSet) throws SQLException {
			Player player = new Player();
			player.setId(resultSet.getInt("id"));
			player.setName(resultSet.getString("name"));
			player.setRoundPoints(resultSet.getInt("points_round"));
			player.setTotalPoints(resultSet.getInt("points_total"));
			return player;
		}
	};

	/**
	 * Insere um jogador no banco de dados.
	 * 
	 * @param player
	 *            Jogador a ser inserido.
	 * @throws SQLException
	 */
	public void save(Player player) throws SQLException {
		String sql = "insert into player ("
				+ "name, points_round, points_total, "
				+ "creature_a_id, creature_b_id) values (?, ?, ?, ?, ?)";

		em.executeQuery(sql, player.getName(), player.getRoundPoints(), player
				.getTotalPoints(), player.getCreatureA().getId(), player
				.getCreatureB().getId());

	}

	/**
	 * Atualiza o jogador no banco de dados.
	 * 
	 * @param player
	 *            Jogador a ser atualizado.
	 * @throws SQLException
	 */
	public void update(Player player) throws SQLException {
		String sql = "update player set points_round = ?, "
				+ "points_total = ?, creature_a_id = ?, creature_b_id = ? "
				+ "where id = ?";

		em.executeQuery(sql, player.getRoundPoints(), player.getTotalPoints(),
				player.getCreatureA().getId(), player.getCreatureB().getId());

	}

	/**
	 * Deleta um jogador especifico.
	 * 
	 * @param id
	 *            Id do jogador a ser deletado.
	 * @throws SQLException
	 */
	public void deleteById(Integer id) throws SQLException {
		String sql = "delete from player where id = ?";
		em.executeQuery(sql, id);

	}

	/**
	 * Deleta todos os jogadores da tabela.
	 * 
	 * @throws SQLException
	 */
	public void deleteAll() throws SQLException {
		String sql = "delete from player";
		em.executeQuery(sql);

	}

	/**
	 * Retorna um jogador especifico
	 * 
	 * @param id
	 *            Id do jogador selecionado.
	 * @return Jogador escolhido.
	 * @throws SQLException
	 */
	public Player searchById(Integer id) throws SQLException {
		String sql = "select id, name, points_round, "
				+ "points_total, creature_a_id, creature_b_id where id = ?";
		return (Player) em.getSingleResult(sql, id);

	}

	/**
	 * Seleciona todos os jogadores e os coloca em uma lista.
	 * 
	 * @return Lista com os jogadores.
	 * @throws SQLException
	 */
	@SuppressWarnings("unchecked")
	public List<Player> searchAll() throws SQLException {
		String sql = "select id, name, points_round, points_total, "
				+ "creature_a_id, creature_b_id  from player";
		return (List<Player>) em.getResultList(sql);
	}

}
